package com.cke.yang.common.infra.utils;

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;

public class FileUtils {

    /**
     * 从文件下载链接中解析出文件名称
     *
     * @param downloadUrl 文件下载链接
     * @return 文件名称，如果无法解析或不包含扩展名则返回null
     */
    public static String getFileNameFromUrl(String downloadUrl) {
        if (downloadUrl == null || downloadUrl.trim().isEmpty()) {
            return null;
        }

        try {
            // URL解码
            String decodedUrl= URLDecoder.decode(downloadUrl, StandardCharsets.UTF_8);
            String decodedUrlCopy = decodedUrl;

            // 移除查询参数
            int queryIndex = decodedUrlCopy.indexOf('?');
            if (queryIndex != -1) {
                decodedUrlCopy = decodedUrlCopy.substring(0, queryIndex);
            }

            // 移除锚点
            int anchorIndex = decodedUrlCopy.indexOf('#');
            if (anchorIndex != -1) {
                decodedUrlCopy = decodedUrlCopy.substring(0, anchorIndex);
            }

            // 获取最后一个斜杠后的内容作为文件名
            int lastSlashIndex = decodedUrlCopy.lastIndexOf('/');
            if (lastSlashIndex != -1 && lastSlashIndex < decodedUrlCopy.length() - 1) {
                String fileName = decodedUrlCopy.substring(lastSlashIndex + 1);
                if (fileName.trim().isEmpty()) {
                    return null;
                }
                // 检查文件名是否包含扩展名
                if (!hasFileExtension(fileName)) {
                    return getFileNameFromUrlParam(decodedUrl);
                }
                return fileName;
            }

            String fileNameFromParam = getFileNameFromUrlParam(decodedUrl);
            // 检查从参数中获取的文件名是否包含扩展名
            if (fileNameFromParam != null && !hasFileExtension(fileNameFromParam)) {
                return null;
            }
            return fileNameFromParam;
        } catch (Exception e) {
            return null;
        }
    }

    /**
     * 检查文件名是否包含扩展名
     *
     * @param fileName 文件名
     * @return 如果包含扩展名返回true，否则返回false
     */
    private static boolean hasFileExtension(String fileName) {
        if (fileName == null || fileName.trim().isEmpty()) {
            return false;
        }
        int lastDotIndex = fileName.lastIndexOf('.');
        // 扩展名必须存在且不能是最后一个字符，且点号不能是第一个字符
        return lastDotIndex > 0 && lastDotIndex < fileName.length() - 1;
    }

    /**
     * 从文件下载链接中解析出文件类型（扩展名）
     *
     * @param downloadUrl 文件下载链接
     * @return 文件类型（不包含点号），如果无法解析则返回null
     */
    public static String getFileTypeFromUrl(String downloadUrl) {
        String fileName = getFileNameFromUrl(downloadUrl);
        if (fileName == null) {
            return null;
        }

        int lastDotIndex = fileName.lastIndexOf('.');
        if (lastDotIndex != -1 && lastDotIndex < fileName.length() - 1) {
            return fileName.substring(lastDotIndex + 1).toLowerCase();
        }

        return null;
    }

    /**
     * 从URL参数中获取fileName参数的值
     *
     * @param url 包含参数的URL
     * @return fileName参数的值，如果不存在则返回null
     */
    public static String getFileNameFromUrlParam(String url) {
        if (url == null || url.trim().isEmpty()) {
            return null;
        }

        try {
            // 查找查询参数部分
            int queryIndex = url.indexOf('?');
            if (queryIndex == -1) {
                return null;
            }

            String queryString = url.substring(queryIndex + 1);

            // 移除锚点
            int anchorIndex = queryString.indexOf('#');
            if (anchorIndex != -1) {
                queryString = queryString.substring(0, anchorIndex);
            }

            // 解析参数
            String[] params = queryString.split("&");
            for (String param : params) {
                String[] keyValue = param.split("=", 2);
                if (keyValue.length == 2 && "fileName".equals(keyValue[0])) {
                    return URLDecoder.decode(keyValue[1], StandardCharsets.UTF_8);
                }
            }
        } catch (Exception e) {
            // 忽略异常
        }

        return null;
    }

}
